package com.atguigu.educenter.controller;

import com.atguigu.commonutils.JwtUtils;
import com.atguigu.educenter.entity.UcenterMember;
import com.atguigu.educenter.service.UcenterMemberService;
import com.atguigu.educenter.utils.ConstantWxUtils;
import com.atguigu.educenter.utils.HttpClientUtils;
import com.atguigu.servicebase.exceptionhandler.GuliException;
import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;

//@RestController
@Controller//只请求地址，不需要返回数据
//@CrossOrigin
@RequestMapping("/api/ucenter/wx")
public class WxApiController {
    @Autowired
    private UcenterMemberService memberService;
    //获取扫描人的信息，添加数据
    @GetMapping("callback")
    public String callback(String code,String state){

   try {
       //        System.out.println("code"+code);
//        System.out.println("state"+state);
       //获取code值，临时票据，类似于验证码
       //拿着code请求微信固定的地址，得到两个值，access_token和openid
       //向认证服务器发送请求换取access_token
       String baseAccessTokenUrl =
               "https://api.weixin.qq.com/sns/oauth2/access_token" +
                       "?appid=%s" +
                       "&secret=%s" +
                       "&code=%s" +
                       "&grant_type=authorization_code";
       //拼接三个参数
       String accessTokenUrl=String.format(
               baseAccessTokenUrl,
               ConstantWxUtils.WX_OPEN_APP_ID,
               ConstantWxUtils.WX_OPEN_APP_SECRET,
               code
       );

       //通过拼接的地址，直接用httpclien发起请求获取access_token和openid
       String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);
//       System.out.println("accessTokenInfo:"+accessTokenInfo);
       //把字符串转化为map模式，取出里面的数值，使用工具类gson
       Gson gson = new Gson();
       HashMap mapAccessToken = gson.fromJson(accessTokenInfo, HashMap.class);
       String access_token = (String) mapAccessToken.get("access_token");//访问许可证
       String openid = (String) mapAccessToken.get("openid");//微信id

       //把扫描人的信息加入数据库里面
       //判断在数据库是否有相同的微信id，有就无需添加
       UcenterMember member=memberService.getOpenIdMenber(openid);
      if (member==null){//如果menber为空，表示没有相同的微信，进行添加
          //拿着caaess_token和openid再去请求微信提供的固定的地址，获取扫描人的信息
          //访问微信的资源服务器，获取用户信息
          String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
                  "?access_token=%s" +
                  "&openid=%s";
          String userInfoUrl = String.format(
                  baseUserInfoUrl,
                  access_token,
                  openid
          );
          //发送请求
          String userInfo = HttpClientUtils.get(userInfoUrl);
//       System.out.println("userInfo:"+userInfo);
          //获取返回的useinfo字符串扫描信息
          HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);
          String nickname = (String) userInfoMap.get("nickname");//昵称
          String headimgurl = (String) userInfoMap.get("headimgurl");//头像

           member = new UcenterMember();
           member.setOpenid(openid);
           member.setNickname(nickname);
           member.setAvatar(headimgurl);
           memberService.save(member);

      }
      //使用jwt根据menber对象生成token字符串
       String jwtToken = JwtUtils.getJwtToken(member.getId(), member.getNickname());
       //最后：返回首页,传递字符串
//       return "redirect:http://localhost:3000?token="+jwtToken;
       return "redirect:http://localhost:3000?token="+jwtToken;
//       return "redirect:http://localhost:3000";
   }catch (Exception e){
      throw new GuliException(20001,"登录失败！");
   }

    }




    //生成二维码
    @GetMapping("login")
    public String getWxCode(){
        //确定地址然后拼接
//        String url=" https://open.weixin.qq.com/connect/qrconnect";
        //微信平台授权baseUrl,%s相当于占位符
        // 微信开放平台授权baseUrl
        String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s" +
                "&redirect_uri=%s" +
                "&response_type=code" +
                "&scope=snsapi_login" +
                "&state=%s" +
                "#wechat_redirect";
        //对redirect_url进行encode编码
       String redirectUrl= ConstantWxUtils.WX_OPEN_REDIRECT_URL;
        try {
            redirectUrl=URLEncoder.encode(redirectUrl,"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        //设置%s里面的值
        String url=String.format(
                baseUrl,
                ConstantWxUtils.WX_OPEN_APP_ID,
                redirectUrl,
                "atguigu"
        );

        //重定向到请求微信地址里面
        return "redirect:"+url;
    }
}
